package mat.simul;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.dalsemi.system.*;
import javax.swing.border.*;
import beancap.*;
import beanclavier.*;
import simulbarr.*;
import mat.Cablage;

public class SimAccesParking extends JFrame implements ProcessPCF8574Event
{
    private SimPCF8574 simPCF8574;
    private JPanel contentPane;
    private Border border1;
    private Border border2;
    private SimCoffretCommande coffretCommande;
    private JPanel carteAPuce = new JPanel();
    private SimCap simCap1;
    private SimulBarriere simulBarriere1;
    private JPanel jPanel1 = new JPanel();
    private JLabel jLabel1 = new JLabel();
    private Buzzer buzzer;

/*
  static
  {
    try
    {
       //String lookDefault = UIManager.getCrossPlatformLookAndFeelClassName();
       String look = UIManager.getSystemLookAndFeelClassName();
       //System.out.println(lookDefault);
       UIManager.setLookAndFeel(look);
    }
    catch(Exception e){e.printStackTrace();}
  }
*/
    public SimAccesParking()
    {
	this(0);
    }

    //Construire le cadre
    public SimAccesParking(int numeroAcces)
    {
	try
	{
	    String look = UIManager.getSystemLookAndFeelClassName();
	    UIManager.setLookAndFeel(look);
	}
	catch(Exception e){ e.printStackTrace();}

	coffretCommande = new SimCoffretCommande(numeroAcces);
	simulBarriere1 = new SimulBarriere();
	simCap1 = new SimCap();
	simPCF8574 =  new SimPCF8574();
	buzzer = new Buzzer();

	simPCF8574.setAdresseI2c(Cablage.PCF8574_AUX);
	simulBarriere1.setAdresseI2c(Cablage.PCF8574_BAR);
	simCap1.setAdresseI2c(Cablage.PCF8582);
	simPCF8574.addToScan(coffretCommande);
	simPCF8574.addToScan(this);
	try
	{
	    jbInit();
	}
	catch(Exception e)
	{
	    e.printStackTrace();
	}
	pack();
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	this.setLocation((d.width - this.getSize().width), (d.height - this.getSize().height));
	setVisible(true);
	simPCF8574.init();
    }

    //Initialiser le composant
    private void jbInit() throws Exception
    {
	//setIconImage(Toolkit.getDefaultToolkit().createImage(FHD66717.class.getResource("[Votre icône]")));
	contentPane = (JPanel) this.getContentPane();
	border1 = BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.darkGray,Color.darkGray,Color.lightGray,Color.darkGray);
	border2 = BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.white,Color.gray,Color.lightGray,Color.gray),BorderFactory.createEmptyBorder(5,5,5,5));
	contentPane.setLayout(null);
	this.getContentPane().setBackground(Color.darkGray);
	this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
	this.setResizable(false);
	this.setTitle("Acces Parking simulé");
	contentPane.setBackground(new Color(65, 65, 65));
	contentPane.setPreferredSize(new Dimension(668, 534));
	coffretCommande.setBackground(Color.lightGray);
	coffretCommande.setBounds(new Rectangle(10, 10, 367, 514));
	carteAPuce.setBackground(Color.lightGray);
	carteAPuce.setBorder(BorderFactory.createLoweredBevelBorder());
	carteAPuce.setBounds(new Rectangle(9, 8, 245, 97));
	carteAPuce.setLayout(null);
	simulBarriere1.setBorder(BorderFactory.createRaisedBevelBorder());
	simulBarriere1.setBounds(new Rectangle(393, 136, 267, 388));
	jPanel1.setBackground(new Color(148, 148, 148));
	jPanel1.setBorder(BorderFactory.createRaisedBevelBorder());
	jPanel1.setBounds(new Rectangle(394, 11, 266, 116));
	jPanel1.setLayout(null);
	simCap1.setBounds(new Rectangle(86, 4, 154, 88));
	jLabel1.setIcon(new ImageIcon(SimAccesParking.class.getResource("ImageCap1.GIF")));
	jLabel1.setText("jLabel1");
	jLabel1.setBounds(new Rectangle(22, 7, 59, 82));

	carteAPuce.add(simCap1, null);
	carteAPuce.add(jLabel1, null);
	contentPane.add(simulBarriere1, null);
	contentPane.add(coffretCommande, null);
	contentPane.add(jPanel1, null);
	jPanel1.add(carteAPuce, null);
    }

    //Supplanté, ainsi nous pouvons sortir quand la fenêtre est fermée
    protected void processWindowEvent(WindowEvent e)
    {
	//super.processWindowEvent(e);
	if (e.getID() == WindowEvent.WINDOW_CLOSING)
	{
	    System.out.println("c'est pas la fin !!");
	}
    }

    public void kill()
    {
	buzzer.stop();
	dispose();
    }

    protected void doCarteIntroduite(boolean introduite)
    {
	simCap1.setCarteIntroduite(introduite);
    }

    public void setNumeroAcces(int numeroAcces)
    {
	coffretCommande.setNumeroAcces(numeroAcces);
    }

    public byte doProcess(int function, byte dataPort)
    {
	if (function == 0) //write
	{
	    boolean alim = ((dataPort &  Cablage.MASQUE_ALIM_CAP) == Cablage.MASQUE_ALIM_CAP);
	    simCap1.setAlim(alim);
	    boolean buz = ((dataPort &  Cablage.MASQUE_BUZZER) == Cablage.MASQUE_BUZZER);
	    buzzer.doBuzzer(buz);
	}
	else
	{
	    if (function == 1) // read
	    {
		if (((dataPort & (byte) Cablage.MASQUE_INTRO_CAP)) == Cablage.MASQUE_INTRO_CAP)
		{
		    if (simCap1.isCarteIntroduite())
		    {
			dataPort = (byte)(dataPort & ~Cablage.MASQUE_INTRO_CAP);
		    }
		}
	    }
	}
	return dataPort;
    }

    public int write(int adresseI2c, byte[] barr, int off, int len)
    {
	int temp;
	temp = simPCF8574.write(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	temp = coffretCommande.write(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	temp = simCap1.write(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	temp = simulBarriere1.write(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	return -1;
    }

    public int read(int adresseI2c, byte[] barr, int off, int  len)
    {
	int temp;
	temp = simPCF8574.read(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	temp = coffretCommande.read(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	temp = simCap1.read(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	temp = simulBarriere1.read(adresseI2c, barr, off, len);
	if (temp != -1) return temp;
	return -1;
    }

    public int writeRead(int adresseI2c, byte[] wbarr, int woff, int wlen, byte[] rbarr, int roff, int rlen)
    {
	return -1;
    }


}